# 进义一个基本的装饰器

def my_decorator(func):
    def my_wrapper(*args,**kwargs):
        print("函数执行前")
        func(*args,**kwargs)
        print("函数执行后")
    return my_wrapper



@my_decorator
def hello(str1,str2,str3, obj):
    print(str1,str2,str3)
    print(obj)
    print("Hello World!")

hello('my_string','my_string2','my_string3',{'key1':'value1','key2':'value2'})

# 这里需要注意的是如果有参数传递的话，一定内部定义的wrapper函数需要有参数的传递



# 关于函数传参的问题， 一个* 代表的是一个元组，列表等，而两个** 代表的是解字典


dict1 = {'key1':'value1','key2':'value2'}


# 此外还可以看到的基本的内容的，参数的传递相关的内容  关于 比如 testFN( a=2)


def testFN(a):
    print(a)



# 传参采用这两种写法都是可以的
testFN(3)
testFN(a=2)

# 如果参数列表中没有b参数据是不能这样去写的
# testFN(b=33)

def testFN2(a,**kwargs):
    print(a)
    print(kwargs)

testFN2(1,b=2,c=3,d=4)

"""
目前对于整体的函数传参问题，有了一个基本的了解，主要有以下几点
1. 一个* 代表的是一个元组，而两个*代表的是一个字典，解字典
2. 如果参数列表中没有b参数是不能直接去传进去的
3. 如果想要传进去任何参数 ，可以采用**kwargs的方式进入传参
"""


# 上面是最基本的装饰器，其实我想到的关于一些类引用的方式进行装饰，这里比如 mcp.tool

# 进一上定义类
class my_class:
    def tool(self,func):
        def wrapper(*args,**kwargs):
            print("函数执行前")
            func(*args,**kwargs)
            print("函数执行后")
        return wrapper
    @staticmethod
    def static_tool(func):
        def wrapper(*args,**kwargs):
            print("函数执行前")
            func(*args,**kwargs)
            print("函数执行后")
        return wrapper



# 类的继承 我是知道的： 直接在类上加一个括号，来添加上需要继承的父类 
# 如果是静态方法应该怎么去处理 @staticmethod
"""
装饰器在python中过于常见的，我可以参考一些经典的装饰器的实现的 

点进 @staticmethod的源码直接进入的 pyi文件 
什么是pyi文件 ？
.pyi 文件 是Python的类型提示接口文件 ，
只包含类型信息不包含具体的实现，
用于为Python代码提供类型支持，

此外就是涉及到的python中的基本的类型的问题了的，整体python的类型也是需要进行一个系统的学习的

"""



mc = my_class()


@mc.tool
def hello(str1,str2,str3, obj):
    print(str1,str2,str3)
    print(obj)
    print("Hello World!")


hello('my_string','my_string2','my_string3',{'key1':'value1','key2':'value2'})

@my_class.static_tool
def test_static_tool():
    print("test_static_tool")


test_static_tool()


